// Package application 应用服务层，负责协调领域对象和处理应用逻辑， 处理应用层的请求和响应，协调用户界面与业务逻辑之间的交互。
package application

import (
	"context"
	"fmt"
	"time"
	"windsurf-project/internal/domain/entity"
	"windsurf-project/internal/domain/service"
)

// UserAppService 用户应用服务
// 负责处理用户相关的应用层业务逻辑
type UserAppService struct {
	userDomainService   *service.UserDomainService
	userPasswordService *service.UserPasswordService
}

// CreateUserRequest 创建用户请求结构体
type CreateUserRequest struct {
	Username string `json:"username"` // Username 用户名
	Email    string `json:"email"`    // Email 电子邮件
	Password string `json:"password"` // Password 密码
}

// UpdateUserRequest 更新用户请求结构体
type UpdateUserRequest struct {
	ID       uint   `json:"id"`       // ID 用户ID
	Username string `json:"username"` // Username 新的用户名
	Email    string `json:"email"`    // Email 新的电子邮件
	Password string `json:"password"` // Password 新的密码
}

// NewUserAppService 创建新的用户应用服务实例
func NewUserAppService(userDomainService *service.UserDomainService) *UserAppService {
	return &UserAppService{
		userDomainService:   userDomainService,
		userPasswordService: &service.UserPasswordService{},
	}
}

// CreateUser 创建新用户
// 处理创建用户的应用层逻辑
func (s *UserAppService) CreateUser(ctx context.Context, req *CreateUserRequest) error {
	hashedPassword, err := s.userPasswordService.HashPassword(req.Password)
	if err != nil {
		return err
	}
	user := entity.NewUser(req.Username, req.Email, hashedPassword)
	return s.userDomainService.CreateUser(ctx, user)
}

// GetUser 获取用户信息
// 根据用户ID获取用户详细信息
func (s *UserAppService) GetUser(ctx context.Context, id uint) (*entity.User, error) {
	return s.userDomainService.GetUser(ctx, id)
}

// UpdateUser 更新用户信息
// 处理更新用户信息的应用层逻辑
func (s *UserAppService) UpdateUser(ctx context.Context, req *UpdateUserRequest) error {
	currentUser, err := s.userDomainService.GetUser(ctx, req.ID)
	if err != nil {
		return err
	}
	user := &entity.User{
		ID:        req.ID,
		CreatedAt: currentUser.CreatedAt,
	}
	if req.Username != "" {
		user.Username = req.Username
	}
	if req.Email != "" {
		user.Email = req.Email
	}
	if req.Password != "" {
		hashedPassword, err := s.userPasswordService.HashPassword(req.Password)
		if err != nil {
			return err
		}
		user.Password = hashedPassword
	}
	user.UpdatedAt = time.Now()
	fmt.Println("APP用户信息", user)
	return s.userDomainService.UpdateUser(ctx, user)
}

// DeleteUser 删除用户
// 根据用户ID删除指定用户
func (s *UserAppService) DeleteUser(ctx context.Context, id uint) error {
	return s.userDomainService.DeleteUser(ctx, id)
}

// ListUsers 获取用户列表
// 获取系统中所有用户的列表
func (s *UserAppService) ListUsers(ctx context.Context) ([]*entity.User, error) {
	return s.userDomainService.ListUsers(ctx)
}
